#!/usr/bin/env python
# coding: utf-8

# In[4]:


import numpy as np
import pandas as pa
import matplotlib.pyplot as plt


# In[117]:


x=np.linspace(0,30,20)
y=x+3*np.random.randn(20)


# In[7]:


x


# In[13]:


y


# In[16]:


plt.scatter(x,y)
plt.plot(x,y)


# In[65]:


from sklearn.linear_model import LinearRegression   #引入包


# In[154]:


model=LinearRegression()  #初始化模型
X=x.reshape(-1,1)         #把数据变成一个一个的[[]]
Y=y.reshape(-1,1)
model.fit(X,Y)            #训练模型


# In[155]:


model.predict([[40]])#预测的第40个数据


# In[34]:


plt.figure(figsize=(12,8))
plt.scatter(X,Y)#散点图
plt.plot(X,model.predict(X))#预测的线性图


# 1.准备模型 2.初始化模型 3.预测 4.评价

# In[35]:


X


# In[172]:


Y_yc=model.predict(X)
np.sum(np.square(Y_yc-Y))  #损失值


# In[173]:


model.intercept_   #Y=kX+b中的b


# In[174]:


model.coef_       #斜率k


# In[175]:


Y_yc2=(model.coef_+0.1)*X+model.intercept_    #调参
np.sum(np.square(Y_yc2-Y))                    #调参后的损失值进行评价


# # 以上评价只能对应短期评价，不适应于长期评价

# 以上称为过拟合，所以需要进行客观评价

# In[176]:


X_train,X_test=X[:15],X[15:]   #train称为训练集
Y_train,Y_test=Y[:15],Y[15:]   #test称为测试集


# In[177]:


X_train


# In[178]:


model=LinearRegression()    #初始化模型
model.fit(X_train,Y_train)  #用训练集训练模型


# In[179]:


model.predict(X_test)   #预测的值


# In[180]:


np.sum(np.square(model.predict(X_test)-Y_test))#损失值


# In[181]:


model.coef_


# In[182]:


model.intercept_


# In[183]:


Y_yc3=model.coef_*X_test+model.intercept_+0.1
np.sum(np.square(Y_yc3-Y_test))


# In[184]:


plt.scatter(X,Y)
plt.plot(X,model.predict(X))
plt.plot(X,model.coef_*X+model.intercept_+0.6,color='r')


# 引入包进行

# In[201]:


from sklearn.model_selection import train_test_split  #划分75%为训练值，剩余为测试值
from sklearn.metrics import mean_squared_error      #用于模型评价


# In[202]:


X_t,X_tes,Y_t,Y_tes=train_test_split(X,Y)


# In[203]:


model=LinearRegression()
model.fit(X_t,Y_t)


# In[204]:


model.coef_


# In[205]:


model.intercept_


# In[206]:


mean_squared_error(model.predict(X_tes),Y_tes)


# In[207]:


y3=model.coef_*X_tes+model.intercept_+1.5
mean_squared_error(y3,Y_tes)


#  过拟合：我们的模型对训练数据上拟合的非常好，但测试集上的数据不好

# 欠拟合：本身模型的训练数据拟合的就不是很好

# 升次方用PolynomialFeatures函数

# In[208]:


from sklearn.preprocessing import PolynomialFeatures  #引入包
q2=PolynomialFeatures(degree=2)                        #升次方
x2=q2.fit_transform(x.reshape(-1,1))                   #升次方
model2=LinearRegression()                              #初始化模型
model2.fit(x2,y)                                       #训练


# In[209]:


y2=model2.predict(x2)
len(x),len(y2)


# In[210]:


plt.scatter(x,y)
plt.plot(x,y2)


# In[ ]:





# In[ ]:





# In[ ]:





# In[ ]:





# In[ ]:





# In[ ]:





# In[ ]:





# In[ ]:




